/**
 * 接力任务
 * 接力任务与多重任务(MultiTask) 不同，一般是以数据表的ID由小到大，一个接一个的执行，在执行其中一个任务的时候同时
 * 读出下一个任务的ID，然后根据这个ID接力执行下一个任务。这样做的好处是不用象多重任务那样一下子读出所有任务ID，适
 * 合于数据较大的表。
 * @param period 每两个任务之间的时间间隔（比如在判断域名是否存在的时候，需要设置一个时间间隔，避免被封）
 * @data 2018 11 27
 * @author yueya
 */
function RelayTask(period){
	if(!arguments[0])period = 0;
	
	var self = this;

	var order = "";//命令 enum{stop}
	var lastExecuteId = 0;

	var isRun = false;

	this.number = 0;
	
	var constructor = function(){

	}();

    /**
	 * 执行任务
     * @param id
     * @param contain
     */
	var execute = function(id, contain){

		if(order == "stop"){
            order = "";
            isRun = false;
            lastExecuteId = 0;
            return;
		}

        lastExecuteId = id;
        if(period > 0){
            setTimeout(function(){
                self.onTask(id, contain);
            }, period);
        }else{
            self.onTask(id, contain);
        }
	}

	/**
	 * 声明抽象方法，等待回调
	 */
	this.onTask = function(id, contain){};
	this.onEnd = function(){};

    /**
	 * 由外部触发的开始按钮
     * @param id 第一次执行任务的ID
     * @param contain 是否包含这个ID
     */
	this.start = function(id, contain){
        if(!arguments[0])id = 0;
        if(!arguments[1])contain = 0;
		if(isRun){
			alert("任务运行中，请勿重复开始");
			return;
		}else{
            isRun = true;
			execute(id, contain);
		}
	}

    this.next = function(id){
        id = (typeof(id) === 'undefined') ? lastExecuteId : id;
        execute(id, 0);
    }

    //重试
	this.retry = function(){
		execute(lastExecuteId, 1);
	}

    /**
	 * 外部触发任务停止
     */
	this.stop = function(){
        if(isRun){
            order = "stop";
        }else{
            alert("任务已停止，请勿重复开始");
        }
	}
}